Skip to content

chore: First steps toward CLA signing#2830

Merged
brob merged 2 commits intomasterfrom
cla
Mar 23, 2026
Merged

chore: First steps toward CLA signing#2830
brob merged 2 commits intomasterfrom
cla

Conversation

@brob
Copy link
Copy Markdown
Contributor

@brob brob commented Mar 18, 2026

This adds the CLA as Markdown in the repo and adds a Workflow that can be used for having folks "sign" it. That then adds them to a signature file that can be kept and checked.

See docs here

Summary by CodeRabbit

  • Chores
    • Added an automated Contributor License Agreement (CLA) check that runs on new PRs and relevant issue comments.
  • Documentation
    • Introduced a Contributor License Agreement document outlining contributor terms.
    • Updated contribution guidelines to require signing the CLA before contributing.

@brob brob requested review from mooreds, omer-topal and ucatbas March 18, 2026 18:03
@brob brob self-assigned this Mar 18, 2026
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 18, 2026

📝 Walkthrough

Walkthrough

Adds a Contribution License Agreement (CLA) document, a GitHub Actions workflow to verify/signature status on PRs and issue comments, and updates CONTRIBUTING.md to require signing the CLA.

Changes

Cohort / File(s) Summary
CLA Workflow
.github/workflows/cla.yml
Adds a GitHub Actions workflow ("CLA Assistant") that triggers on issue comments and pull_request_target, sets explicit workflow permissions, and runs contributor-assistant/github-action with inputs for signatures file, CLA URL, target branch, allowlist, and GITHUB_TOKEN.
CLA Document
CLA.md
Adds full Contribution License Agreement text covering license grants (copyright & patent), representations, termination, third‑party contributions, warranties/disclaimers, and governing law.
Contribution Guidelines
CONTRIBUTING.md
Inserts requirement for contributors to sign the CLA (links to CLA.md) and removes a trailing blank line.

Sequence Diagram(s)

sequenceDiagram
  participant Contributor as "Contributor"
  participant GitHub as "GitHub (Events)"
  participant Runner as "Actions Runner\n(ubuntu-latest)"
  participant Action as "contributor-assistant\nGitHub Action"
  participant Repo as "Repository\n(CLA.md, cla-signatures.json)"

  Contributor->>GitHub: submit PR / comment ("recheck" or "I have read the CLA...")
  GitHub->>Runner: trigger workflow (pull_request_target or issue_comment)
  Runner->>Action: invoke contributor-assistant with inputs & GITHUB_TOKEN
  Action->>Repo: read `CLA.md` and signatures file
  Action->>Repo: post status / comment on PR (signed/unsigned)
  Repo-->>Contributor: update PR status / comment
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 I hopped a PR into the night,
Signed the CLA by soft starlight.
Workflows hum and checks run through,
A rabbit's nibble says "thank you!" 🥕

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Title check ✅ Passed The title accurately describes the main objective: implementing initial CLA infrastructure including the agreement document and GitHub Actions workflow.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch cla

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov
Copy link
Copy Markdown

codecov Bot commented Mar 18, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 82.61%. Comparing base (3bc7f3b) to head (95ed680).
⚠️ Report is 52 commits behind head on master.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #2830      +/-   ##
==========================================
- Coverage   82.63%   82.61%   -0.01%     
==========================================
  Files          74       74              
  Lines        8126     8154      +28     
==========================================
+ Hits         6714     6736      +22     
- Misses        893      897       +4     
- Partials      519      521       +2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/cla.yml:
- Around line 9-13: The workflow currently grants overly broad permissions by
setting "actions: write"; remove the "actions: write" entry (or change it to
"actions: read" only if needed) within the permissions block so the workflow
token has least privilege; ensure the remaining keys ("contents",
"pull-requests", "statuses") retain their intended values and verify no code in
this workflow requires action-level write access before committing the change.
- Around line 26-28: The workflow's CLA configuration has a branch mismatch: the
path-to-document URL points to refs/heads/master but the branch key is set to
'main', which can break signature persistence; update the branch value under the
CLA workflow (the branch: entry in .github/workflows/cla.yml) to match the
repository's default branch used in the URL (change 'main' to 'master') so both
path-to-document and branch are consistent.
- Line 20: The workflow condition currently allows issue comments to trigger the
job whenever comment body matches; update the if expression to ensure
issue_comment events are from pull requests by requiring github.event_name ==
'issue_comment' && github.event.issue.pull_request != null (or truthy) before
evaluating github.event.comment.body, e.g. change the left side to
(github.event_name == 'issue_comment' && github.event.issue.pull_request != null
&& (github.event.comment.body == 'recheck' || github.event.comment.body == 'I
have read the CLA Document and I hereby sign the CLA')) || github.event_name ==
'pull_request_target' so only PR comments trigger the job while preserving
pull_request_target behavior.
- Line 21: Replace the mutable tag reference in the workflow line "uses:
contributor-assistant/github-action@v2.6.1" with the action pinned to the exact
commit SHA (e.g., "uses: contributor-assistant/github-action@<commit-sha>");
resolve the tag v2.6.1 to its corresponding commit SHA (using the provided
script or GitHub API) and update the .github/workflows/cla.yml entry so the
workflow uses the immutable commit SHA instead of the version tag.

In `@CLA.md`:
- Line 3: The opening clause contains a grammatical error: change the phrase
"You provides Contributions" to "You provide Contributions" in the sentence that
reads 'the individual set forth in the signature block (“You”) ... and sets
forth the terms pursuant to which You provides Contributions to the Company.'
Update that exact wording so the subject-verb agreement is correct while
preserving the surrounding legal phrasing (keep "the individual set forth in the
signature block (“You”)" and "sets forth the terms pursuant to which" intact).

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 27b0b910-4328-43e5-8a6c-40e552f2370d

📥 Commits

Reviewing files that changed from the base of the PR and between a9fab73 and 95dfd62.

📒 Files selected for processing (3)
  • .github/workflows/cla.yml
  • CLA.md
  • CONTRIBUTING.md

Comment thread .github/workflows/cla.yml
Comment on lines +9 to +13
permissions:
actions: write
contents: write # this can be 'read' if the signatures are in remote repository
pull-requests: write
statuses: write
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Reduce workflow token permissions to least privilege.

actions: write is broader than needed for this job and should be removed unless there is a demonstrated requirement.

🔐 Suggested patch
 permissions:
-  actions: write
   contents: write # this can be 'read' if the signatures are in remote repository
   pull-requests: write
   statuses: write
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/cla.yml around lines 9 - 13, The workflow currently grants
overly broad permissions by setting "actions: write"; remove the "actions:
write" entry (or change it to "actions: read" only if needed) within the
permissions block so the workflow token has least privilege; ensure the
remaining keys ("contents", "pull-requests", "statuses") retain their intended
values and verify no code in this workflow requires action-level write access
before committing the change.

Comment thread .github/workflows/cla.yml
runs-on: ubuntu-latest
steps:
- name: "CLA Assistant"
if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target'
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Gate issue_comment execution to pull requests only.

At Line 20, the condition can run on regular issue comments if body matches. Add a PR check to avoid unnecessary privileged runs.

🧩 Suggested patch
-        if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target'
+        if: >
+          (github.event_name == 'issue_comment' &&
+           github.event.issue.pull_request &&
+           (github.event.comment.body == 'recheck' ||
+            github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA'))
+          || github.event_name == 'pull_request_target'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target'
if: >
(github.event_name == 'issue_comment' &&
github.event.issue.pull_request &&
(github.event.comment.body == 'recheck' ||
github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA'))
|| github.event_name == 'pull_request_target'
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/cla.yml at line 20, The workflow condition currently
allows issue comments to trigger the job whenever comment body matches; update
the if expression to ensure issue_comment events are from pull requests by
requiring github.event_name == 'issue_comment' &&
github.event.issue.pull_request != null (or truthy) before evaluating
github.event.comment.body, e.g. change the left side to (github.event_name ==
'issue_comment' && github.event.issue.pull_request != null &&
(github.event.comment.body == 'recheck' || github.event.comment.body == 'I have
read the CLA Document and I hereby sign the CLA')) || github.event_name ==
'pull_request_target' so only PR comments trigger the job while preserving
pull_request_target behavior.

Comment thread .github/workflows/cla.yml Outdated
Comment thread .github/workflows/cla.yml Outdated
Comment thread CLA.md
@@ -0,0 +1,31 @@
**INVERSOFT, LLC CONTRIBUTION LICENSE AGREEMENT**

This Contribution License Agreement (the “**CLA**”) is between the individual set forth in the signature block (“**You**”) and Inversoft, LLC., dba FusionAuth and Permify (the “**Company**”), effective as of the date of Your signature and sets forth the terms pursuant to which You provides Contributions to the Company.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix grammatical error in the opening clause.

At Line 3, You provides Contributions should be You provide Contributions to avoid ambiguity in legal wording.

✏️ Suggested patch
-This Contribution License Agreement (the “**CLA**”) is between the individual set forth in the signature block (“**You**”) and Inversoft, LLC., dba FusionAuth and Permify (the “**Company**”), effective as of the date of Your signature and sets forth the terms pursuant to which You provides Contributions to the Company. 
+This Contribution License Agreement (the “**CLA**”) is between the individual set forth in the signature block (“**You**”) and Inversoft, LLC., dba FusionAuth and Permify (the “**Company**”), effective as of the date of Your signature and sets forth the terms pursuant to which You provide Contributions to the Company. 
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
This Contribution License Agreement (the **CLA**) is between the individual set forth in the signature block (**You**) and Inversoft, LLC., dba FusionAuth and Permify (the **Company**), effective as of the date of Your signature and sets forth the terms pursuant to which You provides Contributions to the Company.
This Contribution License Agreement (the "**CLA**") is between the individual set forth in the signature block ("**You**") and Inversoft, LLC., dba FusionAuth and Permify (the "**Company**"), effective as of the date of Your signature and sets forth the terms pursuant to which You provide Contributions to the Company.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CLA.md` at line 3, The opening clause contains a grammatical error: change
the phrase "You provides Contributions" to "You provide Contributions" in the
sentence that reads 'the individual set forth in the signature block (“You”) ...
and sets forth the terms pursuant to which You provides Contributions to the
Company.' Update that exact wording so the subject-verb agreement is correct
while preserving the surrounding legal phrasing (keep "the individual set forth
in the signature block (“You”)" and "sets forth the terms pursuant to which"
intact).

Comment thread .github/workflows/cla.yml Outdated
Comment thread .github/workflows/cla.yml Outdated
Comment thread CLA.md
1. You are legally entitled to grant the above license, and if Your employer(s) has rights to intellectual property that You create that includes Your Contributions, then You represent and warrant that You have received permission to make Contributions on behalf of that employer, that Your employer has waived such rights for Your Contributions to the Company, or that Your employer has executed a separate CLA with the Company;

2. Each of Your Contributions is Your original creation (see section 6 for submissions on behalf of others); and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

weird spacing.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you referring to the indentations on this?

Comment thread CLA.md
Comment thread CLA.md
Comment thread .github/workflows/cla.yml
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/cla.yml:
- Line 29: Update the allowlist entry so it no longer contains the placeholder
"user1" and explicitly exempts Dependabot; locate the allowlist key (allowlist:
user1,bot*) and replace the value to remove the placeholder and include
Dependabot (e.g. use dependabot[bot] or a broader dependabot* pattern) and
optionally retain other bot patterns as needed so Dependabot PRs are exempt from
CLA checks.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f0c86c6c-366a-4168-b9d5-ecceb23a65d2

📥 Commits

Reviewing files that changed from the base of the PR and between 95dfd62 and 95ed680.

📒 Files selected for processing (1)
  • .github/workflows/cla.yml

Comment thread .github/workflows/cla.yml
path-to-document: 'https://raw.githubusercontent.com/Permify/permify/refs/heads/master/CLA.md' # e.g. a CLA or a DCO document
# branch should not be protected
branch: 'master'
allowlist: user1,bot* No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify that contributor-assistant/github-action supports the glob pattern syntax for allowlist

# Check the action's README or documentation for allowlist format
gh api repos/contributor-assistant/github-action/contents/README.md --jq '.content' | base64 -d | grep -A 20 -i "allowlist"

Repository: Permify/permify

Length of output: 111


🏁 Script executed:

cat .github/workflows/cla.yml

Repository: Permify/permify

Length of output: 1213


🏁 Script executed:

ls -la .github/ | grep -E "(dependabot|cla)"

Repository: Permify/permify

Length of output: 122


🏁 Script executed:

cat -n .github/dependabot.yml 2>/dev/null || echo "dependabot.yml not found"

Repository: Permify/permify

Length of output: 1325


🏁 Script executed:

# Search for any documentation or comments about CLA action in the repository
rg "contributor-assistant" --type yml -A 5 -B 5

Repository: Permify/permify

Length of output: 86


🏁 Script executed:

# Search for any comments or documentation in the repository about the CLA action
rg "contributor-assistant" -A 10 -B 5 --type yaml

Repository: Permify/permify

Length of output: 41


🏁 Script executed:

# Look for any issue discussions or documentation files mentioning CLA or allowlist
find . -type f \( -name "*.md" -o -name "*.txt" \) | head -20 | xargs rg -l "allowlist|CLA|contributor-assistant" 2>/dev/null || echo "No matches found"

Repository: Permify/permify

Length of output: 85


🌐 Web query:

contributor-assistant/github-action allowlist pattern syntax documentation

💡 Result:

The contributor-assistant/github-action (CLA Assistant Lite) uses an allowlist input to specify GitHub users or bots exempt from signing the CLA. The syntax is a comma-separated string of usernames or patterns. Examples from official documentation: - Specific users and bots: user1,user2,dependabot[bot],greenkeeper[bot] - Wildcard for all bots: bot* Usage in workflow YAML: uses: contributor-assistant/github-action@v2.6.1 with: allowlist: user1,bot* This skips CLA checks for matching users/bots. Default is empty string (no exemptions). Wildcards like * match username suffixes/prefixes, e.g., bot* for any username starting with "bot".

Citations:


Fix allowlist pattern to exempt Dependabot from CLA checks.

The current allowlist user1,bot* has two issues:

  1. Placeholder value: user1 appears to be example text that should be removed or replaced with actual GitHub usernames.
  2. Dependabot won't be exempted: The pattern bot* matches usernames starting with "bot", but Dependabot's account is dependabot[bot], which starts with "dependabot" and won't match. This will cause CLA checks to fail on automated dependency update PRs.

Since Dependabot is actively configured across multiple ecosystems in dependabot.yml, it should be explicitly exempted.

Suggested fix
-          allowlist: user1,bot*
+          allowlist: dependabot[bot],bot*

Or to cover more bot patterns:

-          allowlist: user1,bot*
+          allowlist: dependabot[bot],*[bot]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/cla.yml at line 29, Update the allowlist entry so it no
longer contains the placeholder "user1" and explicitly exempts Dependabot;
locate the allowlist key (allowlist: user1,bot*) and replace the value to remove
the placeholder and include Dependabot (e.g. use dependabot[bot] or a broader
dependabot* pattern) and optionally retain other bot patterns as needed so
Dependabot PRs are exempt from CLA checks.

@mooreds mooreds self-requested a review March 23, 2026 18:32
Copy link
Copy Markdown
Contributor

@mooreds mooreds left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Ship it!

@brob brob changed the title First steps toward CLA signing chore: First steps toward CLA signing Mar 23, 2026
@brob brob merged commit 8f76cf4 into master Mar 23, 2026
12 of 15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants